CSS와 JS를 이용해 아날로그 시계를 구현해보는 챕터다.
시침 분침 초침이 시간에 따라 움직이도록 하려면 어떻게 해야할까?
로직
시간이 변할 때
시간이 지날 때마다 침들의 deg에 변화를 준다. (rotate)
= 1초, 1분, 1시간을 기준으로!
= 각도는 360도를 기준으로!
침이 움직일 때 (CSS)
= transition 효과를 줘서 실제 시계 침의 움직임과 유사하도록 구현 (째깍째깍의 느낌)
코딩 과정
1. 초침, 분침, 시침을 지정해주자
1 2 3
| const hoursHand = document.querySelector('.hour-hand'); const minutesHand = document.querySelector('.min-hand'); const secondsHand = document.querySelector('.second-hand');
|
그렇다면….. 시간의 흐름을 어떻게 get하고 표현해야할까?
2. 현재 시, 분, 초를 불러오기
현재 시,분,초에 따라 침들의 각도가 달라져야 하기 때문에, 시분초를 불러오는게 가장 먼저 해야 할 일 !
Date(), getHours(), getMinutes(), getSeconds()
1 2 3 4 5 6
| function setDate() { const now = new Date(); const hours = now.getHours(); const minutes = now.getMinutes(); const seconds = now.getSeconds(); }
|
3. 현재 시, 분, 초에 따른 침들의 각도 지정하기!
1 2 3 4 5 6
| const secondsDegrees = (seconds / 60) * 360 + 90; secondsHand.style.transform = `rotate(${secondsDegrees}deg)`; const hoursDegrees = (hours / 12) * 360 + (minutes / 60) * 30 + 90; hoursHand.style.transform = `rotate(${hoursDegrees}deg)`; const minutesDegrees = (minutes / 60) * 360 + (seconds / 60) * 6 + 90; minutesHand.style.transform = `rotate(${minutesDegrees}deg)`;
|
4. setInterval을 활용한 함수의 주기적 실행
setInterval()
1 2
| setInterval(setDate, 1000);
|
최종 완성 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const hoursHand = document.querySelector('.hour-hand'); const minutesHand = document.querySelector('.min-hand'); const secondsHand = document.querySelector('.second-hand');
function setDate() { const now = new Date(); const hours = now.getHours(); const minutes = now.getMinutes(); const seconds = now.getSeconds(); const secondsDegrees = (seconds / 60) * 360 + 90; secondsHand.style.transform = `rotate(${secondsDegrees}deg)`; const hoursDegrees = (hours / 12) * 360 + (minutes / 60) * 30 + 90; hoursHand.style.transform = `rotate(${hoursDegrees}deg)`; const minutesDegrees = (minutes / 60) * 360 + (seconds / 60) * 6 + 90; minutesHand.style.transform = `rotate(${minutesDegrees}deg)`; }
setInterval(setDate, 1000);
|